scheduled.tsx 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import { PermissionAction } from '@supabase/shared-types/out/constants'
  2. import { useParams } from 'common'
  3. import { Info } from 'lucide-react'
  4. import { Admonition } from 'ui-patterns'
  5. import { PageContainer } from 'ui-patterns/PageContainer'
  6. import {
  7. PageHeader,
  8. PageHeaderMeta,
  9. PageHeaderNavigationTabs,
  10. PageHeaderSummary,
  11. PageHeaderTitle,
  12. } from 'ui-patterns/PageHeader'
  13. import { PageSection, PageSectionContent } from 'ui-patterns/PageSection'
  14. import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader'
  15. import { BackupsList } from '@/components/interfaces/Database/Backups/BackupsList'
  16. import DatabaseBackupsNav from '@/components/interfaces/Database/Backups/DatabaseBackupsNav'
  17. import DatabaseLayout from '@/components/layouts/DatabaseLayout/DatabaseLayout'
  18. import DefaultLayout from '@/components/layouts/DefaultLayout'
  19. import AlertError from '@/components/ui/AlertError'
  20. import { DocsButton } from '@/components/ui/DocsButton'
  21. import InformationBox from '@/components/ui/InformationBox'
  22. import NoPermission from '@/components/ui/NoPermission'
  23. import { useBackupsQuery } from '@/data/database/backups-query'
  24. import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions'
  25. import { useIsOrioleDbInAws } from '@/hooks/misc/useSelectedProject'
  26. import { DOCS_URL } from '@/lib/constants'
  27. import type { NextPageWithLayout } from '@/types'
  28. const DatabaseScheduledBackups: NextPageWithLayout = () => {
  29. const { ref: projectRef } = useParams()
  30. const {
  31. data: backups,
  32. error,
  33. isPending: isLoading,
  34. isError,
  35. isSuccess,
  36. } = useBackupsQuery({ projectRef })
  37. const isOrioleDbInAws = useIsOrioleDbInAws()
  38. const isPitrEnabled = backups?.pitr_enabled
  39. const { can: canReadScheduledBackups, isSuccess: isPermissionsLoaded } = useAsyncCheckPermissions(
  40. PermissionAction.READ,
  41. 'back_ups'
  42. )
  43. return (
  44. <>
  45. <PageHeader>
  46. <PageHeaderMeta>
  47. <PageHeaderSummary>
  48. <PageHeaderTitle>Database Backups</PageHeaderTitle>
  49. </PageHeaderSummary>
  50. </PageHeaderMeta>
  51. <PageHeaderNavigationTabs>
  52. <DatabaseBackupsNav active="scheduled" />
  53. </PageHeaderNavigationTabs>
  54. </PageHeader>
  55. <PageContainer>
  56. <PageSection>
  57. <PageSectionContent>
  58. {isOrioleDbInAws ? (
  59. <Admonition
  60. type="default"
  61. title="Database backups are not available for OrioleDB"
  62. description="OrioleDB is currently in public alpha and projects created are strictly ephemeral with no database backups"
  63. >
  64. <DocsButton abbrev={false} className="mt-2" href={`${DOCS_URL}`} />
  65. </Admonition>
  66. ) : (
  67. <div className="flex flex-col gap-y-4">
  68. {isLoading && <GenericSkeletonLoader />}
  69. {isError && (
  70. <AlertError error={error} subject="Failed to retrieve scheduled backups" />
  71. )}
  72. {isSuccess && (
  73. <>
  74. {!isPitrEnabled && (
  75. <p className="text-sm text-foreground-light">
  76. Projects are backed up daily around midnight of your project’s region and
  77. can be restored at any time.
  78. </p>
  79. )}
  80. {isPitrEnabled && (
  81. <InformationBox
  82. hideCollapse
  83. defaultVisibility
  84. icon={<Info strokeWidth={2} />}
  85. title="Point-In-Time-Recovery (PITR) enabled"
  86. description={
  87. <div>
  88. Your project uses PITR and full daily backups are no longer taken. PITR
  89. lets you restore to a specific time (down to the second) within your
  90. selected PITR retention period.{' '}
  91. <a
  92. className="text-brand transition-colors hover:text-brand-600"
  93. href={`${DOCS_URL}/guides/platform/backups`}
  94. >
  95. Learn more
  96. </a>
  97. </div>
  98. }
  99. />
  100. )}
  101. {isPermissionsLoaded && !canReadScheduledBackups ? (
  102. <NoPermission resourceText="view scheduled backups" />
  103. ) : (
  104. <BackupsList />
  105. )}
  106. </>
  107. )}
  108. </div>
  109. )}
  110. </PageSectionContent>
  111. </PageSection>
  112. </PageContainer>
  113. </>
  114. )
  115. }
  116. DatabaseScheduledBackups.getLayout = (page) => (
  117. <DefaultLayout>
  118. <DatabaseLayout title="Backups">{page}</DatabaseLayout>
  119. </DefaultLayout>
  120. )
  121. export default DatabaseScheduledBackups